
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>DevOps 工具链 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>DevOps 工具链 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">文档中用汽车工厂的变迁来类比运维发展的三个阶段，请问这三个阶段分别是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">这三个阶段分别是：1. 手工时代（运维工程师手动配置）；2. 流水线时代（使用Shell脚本实现基础自动化）；3. 智能工厂（使用Ansible、监控系统和Kubernetes等工具实现高度自动化和智能化）。</div>
          </div>
          <div class="card-source">来源: 一、从手工作坊到智能工厂：运维演进史</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在基础设施即代码（IaC）的实践中，文档将 Ansible 和 Terraform 比作了什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档将 Ansible 比作“万能遥控器”，用于配置和管理服务器；将 Terraform 比作“云端乐高”，用于创建和管理云基础设施资源。</div>
          </div>
          <div class="card-source">来源: 二、DevOps工具链全景图 > 1. 基础设施即代码（IaC）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在文档提供的 Jenkins 流水线示例中，“测试”阶段是如何实现并行执行以提高效率的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">“测试”阶段使用了 `parallel` 步骤，它能够同时启动“单元测试” (`mvn test`) 和“集成测试” (`mvn verify -Pintegration`) 两个子任务，从而实现并行执行，缩短测试总耗时。</div>
          </div>
          <div class="card-source">来源: 二、DevOps工具链全景图 > 2. CI/CD流水线</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在Kubernetes编排实战的Deployment配置中，`replicas: 3` 这个设置的具体作用是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`replicas: 3` 的作用是声明式地指定该应用需要运行3个相同的副本（Pod），Kubernetes会确保集群中始终维持这个数量的副本在运行，以实现应用的高可用和负载均衡。</div>
          </div>
          <div class="card-source">来源: 三、容器化革命：Docker与Kubernetes > 2. Kubernetes编排实战</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">根据文档中的Dockerfile示例，一个典型的Java应用容器化需要哪几个关键步骤？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">关键步骤包括：1. 选择一个包含JDK的基础镜像（如 `eclipse-temurin:17-jdk`）；2. 设置容器内的工作目录 (`WORKDIR /app`)；3. 将构建好的Java应用JAR包复制到容器中 (`COPY target/*.jar app.jar`)；4. 声明应用监听的端口 (`EXPOSE 8080`)；5. 定义容器启动时执行的命令 (`ENTRYPOINT ["java","-jar","app.jar"]`)。</div>
          </div>
          <div class="card-source">来源: 三、容器化革命：Docker与Kubernetes > 1. Docker化Java应用</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">架构</div>
          <div class="card-question">在“全自动Java应用交付平台”的架构设计中，各个核心工具是如何串联起来形成完整流水线的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">架构</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">流水线流程为：开发者提交代码到 GitLab，触发 Jenkins 执行CI/CD任务；Jenkins 将构建产物（如Docker镜像）推送到 Nexus 仓库；Ansible 从 Nexus 拉取制品并部署到 Kubernetes 集群。同时，Prometheus 和 Grafana 负责监控系统状态，而 ELK 则用于收集和分析日志。</div>
          </div>
          <div class="card-source">来源: 五、实战：全自动Java应用交付平台 > 架构设计</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">与传统方式相比，文档中提到的自动化方案在“环境部署”和“故障恢复”方面带来了多大的效率提升？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">自动化方案带来了显著的效率提升：“环境部署”时间从传统的1小时缩短到30秒；“故障恢复”时间从4小时大幅减少到5分钟。</div>
          </div>
          <div class="card-source">来源: 五、实战：全自动Java应用交付平台 > 全链路耗时对比</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">安全</div>
          <div class="card-question">文档在“进阶技巧与避坑指南”中提到了哪三种具体的安全加固方案？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">安全</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档中提到的三种安全加固方案是：1. 镜像扫描：将Trivy等工具集成到CI流程中，扫描容器镜像的漏洞；2. 密钥管理：使用HashiCorp Vault等工具管理动态凭证，避免硬编码；3. 网络策略：利用Calico等工具实现零信任网络，控制Pod间的通信。</div>
          </div>
          <div class="card-source">来源: 六、进阶技巧与避坑指南 > 2. 安全加固方案</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">根据文档末尾的展望，AIOps主要体现在哪几个方面的智能化能力？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">AIOps的智能化能力主要体现在四个方面：1. 智能预警（基于机器学习分析监控数据）；2. 自愈系统（自动诊断和修复故障）；3. 预测扩容（根据历史流量预测资源需求）；4. 自然语言运维（通过ChatOps和智能助手进行运维操作）。</div>
          </div>
          <div class="card-source">来源: AIOps的曙光</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
